home *** CD-ROM | disk | FTP | other *** search
/ Programming Windows 95 with MFC / Programming Windows 95 with MFC (Microsoft Programming Series)(097-0001465)(1996).iso / CODE / Chap06 / DlgDemo3 / DlgDemo3.cpp < prev    next >
C/C++ Source or Header  |  1996-04-05  |  8KB  |  296 lines

  1. //***********************************************************************
  2. //
  3. //  DlgDemo3.cpp
  4. //
  5. //***********************************************************************
  6.  
  7. #include <afxwin.h>
  8. #include <stdlib.h>
  9. #include "Resource.h"
  10. #include "DlgDemo3.h"
  11.  
  12. CMyApp myApp;
  13.  
  14. /////////////////////////////////////////////////////////////////////////
  15. // CMyApp member functions
  16.  
  17. BOOL CMyApp::InitInstance ()
  18. {
  19.     m_pMainWnd = new CMainWindow;
  20.     m_pMainWnd->ShowWindow (m_nCmdShow);
  21.     m_pMainWnd->UpdateWindow ();
  22.     return TRUE;
  23. }
  24.  
  25. /////////////////////////////////////////////////////////////////////////
  26. // CMainWindow message map and member functions
  27.  
  28. BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd)
  29.     ON_WM_ERASEBKGND ()
  30.     ON_WM_PAINT ()
  31.     ON_COMMAND (IDM_OPTIONS_SETTINGS, OnOptionsSettings)
  32.     ON_COMMAND (IDM_OPTIONS_EXIT, OnOptionsExit)
  33.     ON_COMMAND (IDM_OPTIONS_ABOUT, OnOptionsAbout)
  34. END_MESSAGE_MAP ()
  35.  
  36. CMainWindow::CMainWindow ()
  37. {
  38.     m_nFillType = 1;
  39.     m_nFillColor = 2;
  40.     m_text = "Hello, MFC";
  41.     m_nHeight = 72;
  42.     m_bBold = TRUE;
  43.     m_bItalic = TRUE;
  44.  
  45.     Create (NULL, "DlgDemo3", WS_OVERLAPPEDWINDOW, rectDefault, NULL,
  46.         MAKEINTRESOURCE (IDR_MAINFRAME));
  47. }
  48.  
  49. BOOL CMainWindow::OnEraseBkgnd (CDC* pDC)
  50. {
  51.     CRect rect;
  52.     GetClientRect (&rect);
  53.  
  54.     m_nFillType == 1 ? DoGradientFill (pDC, &rect) :
  55.         DoSolidFill (pDC, &rect);
  56.     return TRUE;
  57. }
  58.  
  59. void CMainWindow::OnPaint ()
  60. {
  61.     CRect rect;
  62.     GetClientRect (&rect);
  63.  
  64.     CPaintDC dc (this);
  65.     DoDrawText (&dc, &rect);
  66. }
  67.  
  68. void CMainWindow::OnOptionsSettings ()
  69. {
  70.     CSettingsDialog dlg (this);
  71.  
  72.     dlg.m_nFillType = m_nFillType;
  73.     dlg.m_nFillColor = m_nFillColor;
  74.     dlg.m_text = m_text;
  75.     dlg.m_nHeight = m_nHeight;
  76.     dlg.m_bBold = m_bBold;
  77.     dlg.m_bItalic = m_bItalic;
  78.  
  79.     if (dlg.DoModal () == IDOK) {
  80.         m_nFillType = dlg.m_nFillType;
  81.         m_nFillColor = dlg.m_nFillColor;
  82.         m_text = dlg.m_text;
  83.         m_nHeight = dlg.m_nHeight;
  84.         m_bBold = dlg.m_bBold;
  85.         m_bItalic = dlg.m_bItalic;
  86.  
  87.         Invalidate ();
  88.     }
  89. }
  90.  
  91. void CMainWindow::OnOptionsExit ()
  92. {
  93.     SendMessage (WM_CLOSE, 0, 0);
  94. }
  95.  
  96. void CMainWindow::OnOptionsAbout ()
  97. {
  98.     CAboutDialog dlg (this);
  99.     dlg.DoModal ();
  100. }
  101.  
  102. void CMainWindow::DoSolidFill (CDC* pDC, CRect* pRect)
  103. {
  104.     static COLORREF crColor[5] = {
  105.         RGB (255,   0,   0),
  106.         RGB (  0, 255,   0),
  107.         RGB (  0,   0, 255),
  108.         RGB (255,   0, 255),
  109.         RGB (  0, 255, 255),
  110.     };
  111.  
  112.     CBrush brush (crColor[m_nFillColor]);        
  113.     pDC->FillRect (pRect, &brush);
  114. }
  115.  
  116. void CMainWindow::DoGradientFill (CDC* pDC, CRect* pRect)
  117. {
  118.     CBrush* pBrush[64];
  119.     for (int i=0; i<64; i++) {
  120.         switch (m_nFillColor) {
  121.  
  122.         case 0:
  123.             pBrush[i] = new CBrush (RGB (255 - (i * 4), 0, 0));
  124.             break;
  125.  
  126.         case 1:
  127.             pBrush[i] = new CBrush (RGB (0, 255 - (i * 4), 0));
  128.             break;
  129.  
  130.         case 2:
  131.             pBrush[i] = new CBrush (RGB (0, 0, 255 - (i * 4)));
  132.             break;
  133.  
  134.         case 3:
  135.             pBrush[i] = new CBrush (RGB (255 - (i * 4), 0,
  136.                 255 - (i * 4)));
  137.             break;
  138.  
  139.         case 4:
  140.             pBrush[i] = new CBrush (RGB (0, 255 - (i * 4),
  141.                 255 - (i * 4)));
  142.             break;
  143.         }
  144.     }
  145.  
  146.     int nWidth = pRect->Width ();
  147.     int nHeight = pRect->Height ();
  148.     CRect rect;
  149.  
  150.     for (i=0; i<nHeight; i++) {
  151.         rect.SetRect (0, i, nWidth, i + 1);
  152.         pDC->FillRect (&rect, pBrush[(i * 63) / nHeight]);
  153.     }
  154.  
  155.     for (i=0; i<64; i++)
  156.         delete pBrush[i];
  157. }
  158.  
  159. void CMainWindow::DoDrawText (CDC* pDC, CRect* pRect)
  160. {
  161.     CFont font;
  162.     int nHeight = -((pDC->GetDeviceCaps (LOGPIXELSY) * m_nHeight) / 72);
  163.  
  164.     font.CreateFont (nHeight, 0, 0, 0, m_bBold ? FW_BOLD : FW_NORMAL,
  165.         m_bItalic, 0, 0, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS,
  166.         CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH |
  167.         FF_DONTCARE, "Times New Roman");
  168.  
  169.     pDC->SetBkMode (TRANSPARENT);
  170.     pDC->SetTextColor (RGB (255, 255, 255));
  171.  
  172.     CFont* pOldFont = pDC->SelectObject (&font);
  173.     pDC->DrawText (m_text, -1, pRect, DT_SINGLELINE | DT_CENTER |
  174.         DT_VCENTER);
  175.  
  176.     pDC->SelectObject (pOldFont);
  177. }
  178.  
  179. /////////////////////////////////////////////////////////////////////////
  180. // CSettingsDialog message map and member functions
  181.  
  182. BEGIN_MESSAGE_MAP (CSettingsDialog, CDialog)
  183.     ON_BN_CLICKED (IDC_DEFAULTS, OnDefaults)
  184. END_MESSAGE_MAP ()
  185.  
  186. BOOL CSettingsDialog::OnInitDialog ()
  187. {
  188.     CDialog::OnInitDialog ();
  189.  
  190.     CheckRadioButton (IDC_SOLID, IDC_GRADIENT, IDC_SOLID + m_nFillType);
  191.     CheckRadioButton (IDC_RED, IDC_CYAN, IDC_RED + m_nFillColor);
  192.  
  193.     ctlText ().SetWindowText (m_text);
  194.     ctlText ().LimitText (32);
  195.  
  196.     char szHeight[4];
  197.     _itoa (m_nHeight, szHeight, 10);
  198.     ctlHeight ().SetWindowText (szHeight);
  199.     ctlHeight ().LimitText (3);
  200.  
  201.     ctlBold ().SetCheck (m_bBold ? BST_CHECKED : BST_UNCHECKED);
  202.     ctlItalic ().SetCheck (m_bItalic ? BST_CHECKED : BST_UNCHECKED);
  203.     return TRUE;
  204. }
  205.  
  206. void CSettingsDialog::OnOK ()
  207. {
  208.     m_nFillType = GetCheckedRadioButton (IDC_SOLID, IDC_GRADIENT);
  209.     m_nFillColor = GetCheckedRadioButton (IDC_RED, IDC_CYAN);
  210.  
  211.     ctlText ().GetWindowText (m_text);
  212.  
  213.     char szHeight[4];
  214.     ctlHeight ().GetWindowText (szHeight, 4);
  215.     m_nHeight = atoi (szHeight);
  216.  
  217.     if ((m_nHeight < 8) || (m_nHeight > 144)) {
  218.         MessageBox ("Text height must be an integer from 8 through 144");
  219.         ctlHeight ().SetFocus ();
  220.         ctlHeight ().SetSel (0, -1);
  221.         return;
  222.     }
  223.  
  224.     m_bBold = (ctlBold ().GetCheck () == BST_CHECKED) ? TRUE : FALSE;
  225.     m_bItalic = (ctlItalic ().GetCheck () == BST_CHECKED) ? TRUE : FALSE;
  226.  
  227.     CDialog::OnOK ();
  228. }
  229.  
  230. void CSettingsDialog::OnDefaults ()
  231. {
  232.     CheckRadioButton (IDC_SOLID, IDC_GRADIENT, IDC_GRADIENT);
  233.     CheckRadioButton (IDC_RED, IDC_CYAN, IDC_BLUE);
  234.  
  235.     ctlText ().SetWindowText ("Hello, MFC");
  236.     ctlHeight ().SetWindowText ("72");
  237.  
  238.     ctlBold ().SetCheck (BST_CHECKED);
  239.     ctlItalic ().SetCheck (BST_CHECKED);
  240. }
  241.  
  242. int CSettingsDialog::GetCheckedRadioButton (int nFirst, int nLast)
  243. {
  244.     int nCount = nLast - nFirst + 1;
  245.  
  246.     for (int i=0; i<nCount; i++)
  247.         if (IsDlgButtonChecked (nFirst + i))
  248.             return i;
  249.  
  250.     return -1;
  251. }
  252.  
  253. /////////////////////////////////////////////////////////////////////////
  254. // CAboutDialog message map and member functions
  255.  
  256. BEGIN_MESSAGE_MAP (CAboutDialog, CDialog)
  257.     ON_WM_PAINT ()
  258. END_MESSAGE_MAP ()
  259.  
  260. BOOL CAboutDialog::OnInitDialog ()
  261. {
  262.     CDialog::OnInitDialog ();
  263.  
  264.     CStatic* pStatic = (CStatic*) GetDlgItem (IDC_ICONRECT);
  265.     pStatic->GetWindowRect (&m_rect);
  266.     pStatic->DestroyWindow ();
  267.     ScreenToClient (&m_rect);
  268.  
  269.     return TRUE;
  270. }
  271.  
  272. void CAboutDialog::OnPaint ()
  273. {
  274.     CPaintDC dc (this);
  275.     HICON hIcon = (HICON) ::GetClassLong (AfxGetMainWnd ()->m_hWnd,
  276.         GCL_HICON);
  277.  
  278.     if (hIcon != NULL) {
  279.         CDC dcMem;
  280.         dcMem.CreateCompatibleDC (&dc);
  281.  
  282.         CBitmap bitmap;
  283.         bitmap.CreateCompatibleBitmap (&dc, 32, 32);
  284.         CBitmap* pOldBitmap = dcMem.SelectObject (&bitmap);
  285.  
  286.         CBrush brush (::GetSysColor (COLOR_3DFACE));
  287.         dcMem.FillRect (CRect (0, 0, 32, 32), &brush);
  288.         dcMem.DrawIcon (0, 0, hIcon);
  289.  
  290.         dc.StretchBlt (m_rect.left, m_rect.top, m_rect.Width(),
  291.             m_rect.Height (), &dcMem, 0, 0, 32, 32, SRCCOPY);
  292.  
  293.         dcMem.SelectObject (pOldBitmap);
  294.     }
  295. }
  296.